package com.cencat.common.context;

import lombok.Data;

import java.io.Serializable;

/**
 * 租户上下文信息
 * 用于存储当前请求的租户相关信息
 */
@Data
public class TenantContext implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 租户ID
     */
    private Long tenantId;
    
    /**
     * 租户编码
     */
    private String tenantCode;
    
    /**
     * 租户名称
     */
    private String tenantName;
    
    /**
     * 租户状态
     */
    private Integer tenantStatus;
    
    /**
     * 租户套餐ID
     */
    private Long packageId;
    
    /**
     * 租户套餐名称
     */
    private String packageName;
    
    /**
     * 租户套餐过期时间
     */
    private Long packageExpireTime;
    
    /**
     * 当前用户ID
     */
    private Long userId;
    
    /**
     * 当前用户名
     */
    private String username;
    
    /**
     * 当前用户角色
     */
    private String userRole;
    
    /**
     * 当前用户权限列表
     */
    private String[] userPermissions;
    
    /**
     * 请求ID
     */
    private String requestId;
    
    /**
     * 请求时间
     */
    private Long requestTime;
    
    /**
     * 请求IP
     */
    private String requestIp;
    
    /**
     * 请求路径
     */
    private String requestPath;
    
    /**
     * 请求方法
     */
    private String requestMethod;
    
    /**
     * 用户代理
     */
    private String userAgent;
    
    /**
     * 语言环境
     */
    private String locale;
    
    /**
     * 时区
     */
    private String timezone;
    
    /**
     * 创建租户上下文
     * @param tenantId 租户ID
     * @param tenantCode 租户编码
     * @return 租户上下文
     */
    public static TenantContext of(Long tenantId, String tenantCode) {
        TenantContext context = new TenantContext();
        context.setTenantId(tenantId);
        context.setTenantCode(tenantCode);
        return context;
    }
    
    /**
     * 创建租户上下文
     * @param tenantId 租户ID
     * @param tenantCode 租户编码
     * @param userId 用户ID
     * @param username 用户名
     * @return 租户上下文
     */
    public static TenantContext of(Long tenantId, String tenantCode, Long userId, String username) {
        TenantContext context = new TenantContext();
        context.setTenantId(tenantId);
        context.setTenantCode(tenantCode);
        context.setUserId(userId);
        context.setUsername(username);
        return context;
    }
    
    /**
     * 判断租户上下文是否有效
     * @return 是否有效
     */
    public boolean isValid() {
        return tenantId != null && tenantId > 0;
    }
    
    /**
     * 判断租户是否启用
     * @return 是否启用
     */
    public boolean isEnabled() {
        return tenantStatus != null && tenantStatus == 1;
    }
    
    /**
     * 判断租户套餐是否过期
     * @return 是否过期
     */
    public boolean isPackageExpired() {
        return packageExpireTime != null && packageExpireTime < System.currentTimeMillis();
    }
    
    /**
     * 获取租户上下文摘要信息
     * @return 摘要信息
     */
    public String getSummary() {
        return String.format("TenantContext{tenantId=%s, tenantCode=%s, userId=%s, username=%s}", 
            tenantId, tenantCode, userId, username);
    }
}